package com.demo.structure.array;

/**
 * 栈：又名堆栈，它是一种运算受限的线性表。
 * 特点：先进后出
 * 线性数据结构，存储。查找，插入，删除操作只能访问栈的一端（栈顶）
 * <p>
 * 栈顶与栈底 ：允许元素插入与删除的一端称为栈顶，另一端称为栈底。
 * 出栈：栈顶元素的删除操作，也叫做出栈。
 * 入栈：向栈插入元素的操作，叫做进栈，也称压栈、入栈
 *
 * @author: 蔡奇峰
 * @date: 2020/7/13 15:19
 **/
public class MyStack {
    public static void main(String[] args) {
        // 初始化栈，容量为6
        ArrayStack stack = new ArrayStack(6);

        stack.push(8);
        stack.push(6);

        stack.list();

        System.out.println("出栈：" + stack.pop());

        stack.list();
    }
}

/**
 * 用数组模拟栈
 */
class ArrayStack {
    /**
     * 栈大小
     */
    private int size;

    private int[] stack;
    /**
     * 栈顶
     */
    private int top = -1;

    /**
     * 构造函数用于初始化
     *
     * @param size
     */
    public ArrayStack(int size) {
        this.size = size;

        stack = new int[size];
    }

    /**
     * 入栈
     *
     * @param value
     */
    public void push(int value) {
        if (isFull()) {
            System.out.println("栈满！入栈失败！");
            return;
        }
        // 每次入栈加1
        top ++;
        stack[top] = value;
    }

    /**
     * 出栈
     *
     * @return
     */
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈空！出栈失败");
        }
        int value = stack[top];
        // 每次出栈后移
        top --;
        return value;
    }

    public void list(){
        if (isEmpty()){
            System.out.println("栈空！");
            return;
        }

        System.out.print("栈：");
        for (int i = 0; i <= top; i++) {
            System.out.printf("%d\t", stack[i]);
        }
        System.out.println();
    }

    /**
     * 是否栈满
     *
     * @return
     */
    public boolean isFull() {
        return top == size - 1;
    }

    /**
     * 是否栈空
     *
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }
}